9.5 Список Задач + SQLite + Interface + DI
7 из 7 шагов пройдено

 Список Задач + SQLite + Interface + DI

➡️Ссылка на репозиторий с кодом этого урока

Создание сервиса SqliteService

Добавим новый файл, в котором будет реализована вся логика работы с базой данных SQLite. Этот класс, как и SharedPreferencesService, должен реализовать интерфейс IStorageService.

Пакет sqflite предлагает два основных способа выполнения SQL-запросов:

  1. Через "чистые" SQL-строки
  2. Через встроенные функции-хелперы, которые напоминают работу с ORM (Object-Relational Mapping

База по SQL

Чтобы понимать, что происходит "под капотом" в SqliteService, полезно знать основы языка SQL (Structured Query Language) — стандартного языка для взаимодействия с базами данных.

SQL-команды, которые мы использовали, относятся к основным операциям CRUD (Create, Read, Update, Delete).

CREATE TABLE - Создание таблицы

Эта команда используется для определения структуры таблицы, ее колонок и типов данных.

CREATE TABLE tasks(
  id INTEGER PRIMARY KEY AUTOINCREMENT, -- Целочисленный уникальный ключ
  text TEXT, -- Текстовое поле
  isDone INTEGER -- Целочисленное поле (0 или 1)
);

INSERT  - Вставить (Create) запись. Добавляет новую строку в таблицу

Вставить (INSERT) значения в таблицу tasks (INTO tasks) в поля id, text, isDone
значениями VALUES (?, ?, ?) вместо вопросов подставятся подряд значения, например из списка

db.rawInsert(
  'INSERT INTO tasks(text, isDone) VALUES(?, ?)',
  [task.text, 0],
);

SELECT - Чтение (Read) записей

Извлекает данные из таблицы. Это самая часто используемая команда
Выбрать (SELECT) все значения (*) из таблицы tasks

db.rawQuery('SELECT * FROM tasks');

UPDATE - Обновление (Update) записи

Изменяет существующие данные в таблице.

Обновить (UPDATE) запись в таблице (tasks) изменив значение isDone (SET isDone = ?) где ID этой записи равен нужному значению WHERE id = ?
Вместо вопросов подставятся подряд значения, например из списка

db.rawUpdate(  
  'UPDATE $_tasksTableName SET isDone = ? WHERE id = ?',  
  [task.isDone ? 1 : 0, task.id],  
);

Ключевое слово WHERE указывает, какую именно строку (или строки) нужно обновить. Без него команда UPDATE изменила бы все записи в таблице!

Важно! В SQLite нет типа данных BOOLEAN.

Стандартная практика - использование INTEGER, где 0 означает false, а 1 — true.

Модель Task при преобразовании в JSON преобразует bool в int, но при чтении из базы нужно выполнить обратное преобразование maps[i]['isDone'] == 1

DELETE Удаление (Delete) записи

Удаляет строки из таблицы
Удалить (DELETE) запись из таблицы tasks (FROM tasks) по ID этой записи (WHERE id = ?)
Вместо вопросов подставятся подряд значения, например из списка

db.rawDelete(
  'DELETE FROM $_tableName WHERE id = ?', 
  [id]
);

Как и в UPDATEWHERE здесь критически важен для указания удаляемой записи.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий